// 获取canvas元素和上下文
const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');

// 设置canvas尺寸
const box = 20;
const canvasSize = 20;
canvas.width = canvasSize * box;
canvas.height = canvasSize * box;

// 游戏变量
let snake = [];
let food = {};
let specialFood = {};
let score = 0;
let restartCount = 0;
let d = 'RIGHT'; // 初始方向向右
let gameRunning = false;
let gameLoop;
let speed = 150; // 默认速度
let isGameOver = false; // 新增变量，用于标记游戏是否真正结束
let specialFoodActive = false; // 标记特殊食物是否激活
let specialFoodMultiplier = 2; // 特殊食物的倍数，默认为2

// 获取DOM元素
const scoreDisplay = document.getElementById('score');
const restartCountDisplay = document.getElementById('restartCount');
const speedValue = document.getElementById('speedValue');
const speedRange = document.getElementById('speedRange');
const canvasOverlay = document.getElementById('canvasOverlay');

// 初始化游戏
function initGame() {
    // 初始化蛇
    snake = [
        {x: 9, y: 10}
        // 将贪吃蛇的默认初始长度改为1
    ];
    
    // 生成食物
    generateFood();
    
    // 重置分数和方向
    score = 0;
    d = 'RIGHT';
    
    // 重置特殊食物
    specialFood = {};
    specialFoodActive = false;
    specialFoodMultiplier = Math.floor(Math.random() * 9) + 2; // 随机生成2-10之间的倍数
    
    // 更新显示
    scoreDisplay.textContent = score;
    restartCountDisplay.textContent = restartCount;
}

// 生成普通食物
function generateFood() {
    food = {
        x: Math.floor(Math.random() * canvasSize),
        y: Math.floor(Math.random() * canvasSize)
    };
    
    // 确保食物不在蛇身上
    for (let i = 0; i < snake.length; i++) {
        if (snake[i].x === food.x && snake[i].y === food.y) {
            generateFood();
            break;
        }
    }
    
    // 有一定概率生成特殊食物
    if (!specialFoodActive && Math.random() < 0.3) { // 30%概率生成特殊食物
        generateSpecialFood();
    }
}

// 生成特殊食物
function generateSpecialFood() {
    specialFood = {
        x: Math.floor(Math.random() * canvasSize),
        y: Math.floor(Math.random() * canvasSize)
    };
    
    // 随机生成2-10之间的倍数
    specialFoodMultiplier = Math.floor(Math.random() * 9) + 2;
    
    // 确保特殊食物不在蛇身上或普通食物位置
    for (let i = 0; i < snake.length; i++) {
        if ((snake[i].x === specialFood.x && snake[i].y === specialFood.y) || 
            (specialFood.x === food.x && specialFood.y === food.y)) {
            generateSpecialFood();
            break;
        }
    }
    
    specialFoodActive = true;
}

// 绘制游戏
function drawGame() {
    // 清空画布
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    
    // 绘制蛇
    for (let i = 0; i < snake.length; i++) {
        // 使贪吃蛇增长的节点与头部节点颜色一致
        ctx.fillStyle = 'green';
        ctx.fillRect(snake[i].x * box, snake[i].y * box, box, box);
        ctx.strokeStyle = 'black';
        ctx.strokeRect(snake[i].x * box, snake[i].y * box, box, box);
    }
    
    // 绘制普通食物
    ctx.fillStyle = 'red';
    ctx.fillRect(food.x * box, food.y * box, box, box);
    
    // 绘制特殊食物（如果激活）
    if (specialFoodActive) {
        ctx.fillStyle = 'gold';
        ctx.fillRect(specialFood.x * box, specialFood.y * box, box, box);
        
        // 绘制倍数数字
        ctx.fillStyle = 'black';
        ctx.font = '16px Arial';
        ctx.textAlign = 'center';
        ctx.textBaseline = 'middle';
        ctx.fillText(specialFoodMultiplier.toString(), specialFood.x * box + box/2, specialFood.y * box + box/2);
    }
}

// 移动蛇
function moveSnake() {
    // 复制蛇头
    let snakeHead = {...snake[0]};
    
    // 根据方向移动蛇头
    switch(d) {
        case 'UP':
            snakeHead.y--;
            break;
        case 'DOWN':
            snakeHead.y++;
            break;
        case 'LEFT':
            snakeHead.x--;
            break;
        case 'RIGHT':
            snakeHead.x++;
            break;
    }
    
    // 检查碰撞边界
    if (snakeHead.x < 0 || snakeHead.x >= canvasSize || snakeHead.y < 0 || snakeHead.y >= canvasSize) {
        gameOver();
        return;
    }
    
    // 检查碰撞自己
    for (let i = 0; i < snake.length; i++) {
        if (snakeHead.x === snake[i].x && snakeHead.y === snake[i].y) {
            gameOver();
            return;
        }
    }
    
    // 将新头添加到蛇数组开头
    snake.unshift(snakeHead);
    
    // 检查是否吃到普通食物
    if (snakeHead.x === food.x && snakeHead.y === food.y) {
        // 增加分数
        score++;
        scoreDisplay.textContent = score;
        // 生成新食物
        generateFood();
    } 
    // 检查是否吃到特殊食物
    else if (specialFoodActive && snakeHead.x === specialFood.x && snakeHead.y === specialFood.y) {
        // 增加分数
        score += specialFoodMultiplier;
        scoreDisplay.textContent = score;
        
        // 蛇长度增加指定倍数
        let currentLength = snake.length;
        for (let i = 0; i < currentLength * (specialFoodMultiplier - 1); i++) {
            snake.push({...snake[snake.length - 1]});
        }
        
        // 重置特殊食物
        specialFood = {};
        specialFoodActive = false;
        
        // 生成新食物
        generateFood();
    } else {
        // 移除蛇尾
        snake.pop();
    }
}

// 游戏结束
function gameOver() {
    clearInterval(gameLoop);
    gameRunning = false;
    isGameOver = true; // 标记游戏结束
    restartCount++;
    restartCountDisplay.textContent = restartCount;
    canvasOverlay.classList.remove('hidden');
}

// 游戏主循环
function gameStep() {
    moveSnake();
    drawGame();
}

// 开始游戏
function startGame() {
    if (!gameRunning) {
        initGame();
        gameRunning = true;
        isGameOver = false; // 重置游戏结束标记
        canvasOverlay.classList.add('hidden');
        gameLoop = setInterval(gameStep, speed);
    }
}

// 暂停/继续游戏
function pauseGame() {
    if (gameRunning) {
        clearInterval(gameLoop);
        gameRunning = false;
        canvasOverlay.classList.remove('hidden');
    }
}

// 继续游戏
function resumeGame() {
    if (!gameRunning && !isGameOver) { // 只有在非游戏结束状态下才能继续
        gameLoop = setInterval(gameStep, speed);
        gameRunning = true;
        canvasOverlay.classList.add('hidden');
    }
}

// 重置游戏
function resetGame() {
    clearInterval(gameLoop);
    gameRunning = false;
    isGameOver = true; // 游戏重置后处于暂停状态，应设置为true
    initGame();
    drawGame();
    // 游戏重置后显示覆盖层，呈现暂停效果
    canvasOverlay.classList.remove('hidden');
}

// 改变方向
function changeDirection(event) {
    let key = event.keyCode;
    
    // 阻止方向键和空格键的默认行为
    if ((key >= 37 && key <= 40) || key === 32) {
        event.preventDefault();
    }
    
    // 空格键暂停/继续游戏
    if (key === 32) { // 空格键
        if (gameRunning) {
            // 游戏运行中时，暂停游戏
            pauseGame();
        } else if (!canvasOverlay.classList.contains('hidden')) {
            // 游戏未运行且覆盖层可见时，继续游戏
            resumeGame();
        }
        return; // 添加return语句，确保不会继续执行下面的代码
    }
    
    // 游戏未运行且覆盖层可见时，任意键开始游戏
    // 注意：这里只在游戏真正结束时有效，暂停时不响应
    if (!gameRunning && !canvasOverlay.classList.contains('hidden') && isGameOver) {
        startGame();
        // 如果是方向键，则更新初始方向
        if ((key === 37 || key === 65) && d !== 'RIGHT') { // 左
            d = 'LEFT';
        } else if ((key === 38 || key === 87) && d !== 'DOWN') { // 上
            d = 'UP';
        } else if ((key === 39 || key === 68) && d !== 'LEFT') { // 右
            d = 'RIGHT';
        } else if ((key === 40 || key === 83) && d !== 'UP') { // 下
            d = 'DOWN';
        }
        return;
    }
    
    // 游戏运行中时，只响应方向键控制
    if (gameRunning) {
        // 使用箭头键或WASD控制方向
        if ((key === 37 || key === 65) && d !== 'RIGHT') { // 左
            d = 'LEFT';
        } else if ((key === 38 || key === 87) && d !== 'DOWN') { // 上
            d = 'UP';
        } else if ((key === 39 || key === 68) && d !== 'LEFT') { // 右
            d = 'RIGHT';
        } else if ((key === 40 || key === 83) && d !== 'UP') { // 下
            d = 'DOWN';
        }
        return;
    }
    
    // 其他情况（游戏暂停时），不响应除空格键外的其他按键
    return;
}

// 更新游戏速度
function updateSpeed(value) {
    speed = 200 - value; // 转换范围从0-100到200-100ms
    speedValue.textContent = value;
    
    // 如果游戏正在运行，重新启动循环以应用新速度
    if (gameRunning) {
        clearInterval(gameLoop);
        gameLoop = setInterval(gameStep, speed);
    }
}

// 添加键盘事件监听器
document.addEventListener('keydown', changeDirection);

// 初始化游戏
resetGame();

// 事件监听器
document.addEventListener('keydown', changeDirection);
document.getElementById('startBtn').addEventListener('click', startGame);
document.getElementById('resetBtn').addEventListener('click', resetGame);
speedRange.addEventListener('input', function() {
    updateSpeed(this.value);
});